<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			 //什么是原型链?-实例对象(new出的对象)与原型之间的连接关系
			//  原型链概念:在获取对象属性时，如果对象本身没有这个属性，那就会去他的原型__proto__上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null。
			
			 // 一.js的内置对象
			 var arr=[1,2]; //字面量方式
			 var json={}
		     var arr1=new Array(1,2); //实例化方式,new Array，new的是构造函数。得到的var 变量叫对象。
			var str=''
            //1.0 对象下有属性constructor，可得到构造函数 。
            console.log(arr.constructor) //Array
            console.log(json.constructor) //Object
            console.log(str.constructor) //String


            console.dir(Array); //可查看构造函数属性
            console.log(Array.prototype)//构造函数原型上是方法
            console.log(25,String.prototype)//构造函数原型上是方法
            console.log(26,Object.prototype)//构造函数原型上是方法


            console.log(arr); //现实中的对象
            console.log(30,arr.__proto__) //对象都有一个隐式属性 __proto__ ，可以得对象的方法
           
            
          //1.1 构造函数有显示属性prototype,对象有隐式属性 __proto__。它们是相等的
          console.log(Array.prototype==arr.__proto__) //true
          
           //1.2 js中所有的都是对象-从你父级找到你爷爷
           console.log(37,Array.prototype.__proto__);
           console.log(38,Object.prototype)
           console.log(Array.prototype.__proto__==Object.prototype)//true

           var obj={}
           console.log(Array.prototype.__proto__==obj.__proto__)//true

          //1.3 万物为空  最终都会找到null
          console.log(Object.prototype.__proto__==null) //true

	
		 /*   // 总结：
		   // 原型链:实例对象(new出的对象)与原型之间的连接的关系，内部真正靠__proto__( 隐式连接 )实现的。
		  0.构造函数获取：new对象.constructor   可获取构造函数
		   1.对象有属性：new对象.__proto__       可获取对象下属性与方法
		   2.构造函数有属性: Array.prototype, 可获取对象下属性与方法
		   3.js一切皆为对象：Array.prototype.__proto__   可找到父级对象下属性与方法 Object.prototype
		   4.而对象Object.prototype.__proto__最终会找到空null
		   */
/*
javascript原型与原型链面试题总结:	 
1. prototype
每个函数都有一个prototype属性，被称为显示原型
Array.prototype
2.__proto__
每个实例对象都会有__proto__属性,其被称为隐式原型
arr.__proto__
每一个实例对象的隐式原型__proto__属性指向自身构造函数的显式原型prototype
Array.prototype==arr.__proto__
3. constructor
每个对象 prototype原型都有一个constructor属性，指向它关联的构造函数。
arr.constructor  
4. 原型链
获取对象属性时，如果对象本身没有这个属性，那就会去他的原型__proto__上去找，如果还查不到，就去找原型的原型，一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null 
Array.prototype.__proto__==Object.prototype  , Object.prototype.__proto__==null
*/
		 
		 // 所以咱们上节课讲的-原型继承 子类.prototype=new 父类() 就能实现继承关系
			 
		 //二.自己写对象也会遵循上面特点
		/*   function Person(name1){  //构造函数
		    	this.name=name1;
		    	
		    }
		    Person.prototype.say=function(){
		    	console.log(this.name+'会说话')
		    }
			
			
			var per=new Person('人类');
			per.say()
			
			
			console.log(per.constructor) //获取构造函数  function Person(){}
			console.log(Person.prototype) //获取该原型下的属性于方法
			console.log(per.__proto__) //对象通过隐式属性也可获取它下面的属于方 法 */
			
			
		</script>
	</body>
</html>
